package com.ssamkj.wstar.common;

import java.sql.Timestamp;
import java.util.Calendar;
import java.util.Date;

public class DateUtil {
	/**
	 * @param time : 10자리 시간 숫자
	 * @return YYYY-MM-DD HH:MI
	 * @return 만약 param이 널이거나 0이면 -
	 */
	public static String getYYYY_MM_DD_HH_MI(String time){
		if(time == null || time.equals("0")) return "-";
		return new Timestamp(Long.parseLong(time + "000")).toString().substring(0, 16);
	}
	
	/**
	 * 한달 전 YYYY-MM-DD 구하기
	 * @return YYYY-MM-DD
	 */
	public static String getBeforeMonthYYYY_MM_DD(){
		Timestamp time = new Timestamp(getPrevMonthStart());
		return time.toString().substring(0,10);
	}
	
	/**
	 * 하루 전 YYYY-MM-DD 구하기
	 * @return YYYY-MM-DD
	 */
	public static String getBeforeDayYYYY_MM_DD(){
		Timestamp time = new Timestamp(getPrevDayStart());
		return time.toString().substring(0,10);
	}
	
	/**
	 * 현재 YYYY-MM-DD 구하기
	 * @return YYYY-MM-DD
	 */
	public static String getYYYY_MM_DD(){
		Timestamp time = new Timestamp(new Date().getTime());
		return time.toString().substring(0,10);
	}
	
	/**
	 * 입력 일 1주일 전 시작 시간 구하기
	 * @param inTime(10자리 Timestamp 값)
	 * @return 일 Timestamp(10자리 Timestamp)
	 */
	public static String getPrevWeekStart(String inTime){
		Timestamp time = new Timestamp(Long.parseLong(inTime+"000"));
		
		int y = Integer.parseInt(time.toString().substring(0,4));
		int m = Integer.parseInt(time.toString().substring(5,7));
		int d = Integer.parseInt(time.toString().substring(8,10));
		
		Calendar c = Calendar.getInstance();
		
		c.set(y,m-1,d - 6, 0, 0, 0);
		
		return String.valueOf(c.getTimeInMillis()/1000);
	}
	
	/**
	 * 입력 달 1일 시작 시간 구하기
	 * @param inTime(10자리 Timestamp 값)
	 * @return 일 Timestamp(10자리 Timestamp)
	 */
	public static String getCurrMonthStart(String inTime){
		Timestamp time = new Timestamp(Long.parseLong(inTime+"000"));
		
		int y = Integer.parseInt(time.toString().substring(0,4));
		int m = Integer.parseInt(time.toString().substring(5,7));
		
		Calendar c = Calendar.getInstance();
		
		c.set(y,m-1,1, 0, 0, 0);
		
		return String.valueOf(c.getTimeInMillis()/1000);
	}
	
	/**
	 * 입력 달 말일 끝 시간 구하기
	 * @param inTime(10자리 Timestamp 값)
	 * @return 일 Timestamp(10자리 Timestamp)
	 */
	public static String getCurrMonthEnd(String inTime){
		Timestamp time = new Timestamp(Long.parseLong(inTime+"000"));
		
		int y = Integer.parseInt(time.toString().substring(0,4));
		int m = Integer.parseInt(time.toString().substring(5,7));
		int lastDay = 0;
		if(m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12){
			lastDay = 31;
		}else if(m == 4 || m == 6 || m == 9 || m == 11){
			lastDay = 30;
		}else if(m == 2 && isLeapYear(y)){
			lastDay = 29;
		}else if(m == 2 && !isLeapYear(y)){
			lastDay = 28;
		}			
		
		Calendar c = Calendar.getInstance();
		
		c.set(y,m-1,lastDay, 23, 59, 59);
		
		return String.valueOf(c.getTimeInMillis()/1000);
	}
	
	/**
	 * 해당 달의 일수 구하기
	 * @param yyyy-mm
	 * @return String : 일 수
	 */
	public static String getDayNumber(String yyyy_mm){
		int y = Integer.parseInt(yyyy_mm.substring(0,4));
		int m = Integer.parseInt(yyyy_mm.substring(5,7));
		
		int dayNumber = 0;
		
		if(m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12){
			dayNumber = 31;
		}else if(m == 4 || m == 6 || m == 9 || m == 11){
			dayNumber = 30;
		}else if(m == 2 && isLeapYear(y)){
			dayNumber = 29;
		}else if(m == 2 && !isLeapYear(y)){
			dayNumber = 28;
		}		
		
		return String.valueOf(dayNumber);
	}
	
	/**
	 * 현재에서 한달 전 시작 시간 구하기
	 * @return 일 Timestamp(10자리 Timestamp)
	 */
	public static long getPrevMonthStart(){
		Timestamp time = new Timestamp(new Date().getTime());
		
		int y = Integer.parseInt(time.toString().substring(0,4));
		int m = Integer.parseInt(time.toString().substring(5,7));
		int d = Integer.parseInt(time.toString().substring(8,10));
		
		Calendar c = Calendar.getInstance();
		c.set(y,m - 2,d, 0, 0, 0);
		
		return c.getTimeInMillis();		
	}
	
	/**
	 * 현재에서 하루 전 시작 시간 구하기
	 * @return 일 Timestamp(10자리 Timestamp)
	 */
	public static long getPrevDayStart(){
		Timestamp time = new Timestamp(new Date().getTime());
		
		int y = Integer.parseInt(time.toString().substring(0,4));
		int m = Integer.parseInt(time.toString().substring(5,7));
		int d = Integer.parseInt(time.toString().substring(8,10));
		
		Calendar c = Calendar.getInstance();
		c.set(y,m - 1,d - 1, 0, 0, 0);
		
		return c.getTimeInMillis();		
	}
	
	/**
	 * YYYYMMDD 입력 일 시간 Timestamp 구하기
	 * @param yyyy-mm-dd, true : 시작, false : 끝 시간
	 * @return Timestamp 10자리수
	 */
	public static String getYYYYMMDDTimestamp(boolean startTime, String inTime){		
		if(inTime == null || inTime.equals("") || inTime.equals("0") || inTime.equals("null") || inTime.equals("NULL")) return "";
		Calendar c = Calendar.getInstance();
		if(startTime)
			c.set(Integer.parseInt(inTime.substring(0,4)),Integer.parseInt(inTime.substring(5,7)) - 1,Integer.parseInt(inTime.substring(8,10)), 0, 0, 0);
		else
			c.set(Integer.parseInt(inTime.substring(0,4)),Integer.parseInt(inTime.substring(5,7)) - 1,Integer.parseInt(inTime.substring(8,10)), 23, 59, 59);
		return String.valueOf(c.getTimeInMillis()/1000);
	}
	
	/**
	 * 10자리 timestamp 구하기
	 *@param YYYY-MM-DD 24HH:MI:SS
	 *   또는 YYYY-MM-DD
	 *@return SSSSSSSSSS
	 */
	public static String getYYYYMMDDSSTimestamp(String inTime){		
		if(inTime == null || inTime.equals("") || inTime.equals("0") || inTime.equals("null") || inTime.equals("NULL")) return "";
		Calendar c = Calendar.getInstance();
		
		if(inTime.length() == 10){
			if ( inTime.equals( "1970-01-01" )) return "0";
			c.set(Integer.parseInt(inTime.substring(0,4)),Integer.parseInt(inTime.substring(5,7)) - 1,Integer.parseInt(inTime.substring(8,10)), 
					0, 0, 0 );
		}else{
			c.set(Integer.parseInt(inTime.substring(0,4)),Integer.parseInt(inTime.substring(5,7)) - 1,Integer.parseInt(inTime.substring(8,10)), 
				Integer.parseInt(inTime.substring( 11, 13 ) ), Integer.parseInt(inTime.substring( 14, 16 ) ), Integer.parseInt(inTime.substring( 17, 19 ) ) );
		}
		return String.valueOf(c.getTimeInMillis()/1000);
	}
	
	/**
	 * YYYY-MM-DD HH:MM:SS 구하기
	 * @param 10자리 Str
	 */
	public static String getTime(String str){
		return new Timestamp(Long.parseLong(str) * 1000).toString().substring(0,19);
	}
	
	/**
	 * YYYY/MM/DD HH:MM 구하기
	 * @param 10자리 Str
	 */
	public static String getTime2(String str){
		String a = new Timestamp(Long.parseLong(str) * 1000).toString();
		return a.substring(0,4) + "/" + a.substring(5,7) + "/" + a.substring(8,10) + a.substring(10,16);
	}
	
	/**
	 * 윤달 구하기
	 * @param year : 4자리 년도
	 * @return true : 윤년, false : 평년
	 */
	public static boolean isLeapYear(int yyyy){
		if((yyyy % 4 == 0)&&(yyyy % 100 != 0) || yyyy % 400 == 0) return true;
		else return false;
	}
}